<?php
/**
 * Created by PhpStorm.
 * User: qingyun
 * Date: 17/4/13
 * Time: 下午9:01
 */
namespace Admin\Controller;
use Common\Controller\AdminBaseController;

class AdminController extends AdminBaseController{
    /**
     * 管理员账号列表页
     */
    public function index(){
        //  搜索内容 $title
        $title = I('get.title/s');
        $whereSql = empty($title) ? '' : 'name like "%' . $title . '%" or realName like "%' . $title . '%"';

        $admin = M('admin');

        // 查询满足要求的总记录数
        $count = $admin->where($whereSql) -> count();
        /**
         * tp 分页
         */
//        // 实例化分页类 传入总记录数和每页显示的记录数(5)
//        $Page = new \Think\Page($count,2);
//        // 分页样式设置
//
//        // true 尾页显示为数字  false 可以定义
//        $Page -> lastSuffix = false;
//        // 显示几个页码
//        $Page -> rollPage = 9;
//
//        $Page -> setConfig('header','共%TOTAL_ROW%个管理员-%TOTAL_PAGE%页');
//        $Page -> setConfig('first','首页');
//        $Page -> setConfig('prev','上一页');
//        $Page -> setConfig('next','下一页');
//        $Page -> setConfig('last','尾页');
//        $Page -> setConfig('theme','%HEADER% %FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%');
//        // 分页显示输出
//        $pageShow = $Page->show();
//        $this -> assign('pageShow',$pageShow);
//
//        // 进行分页数据查询 注意limit方法的参数要使用Page类的属性
//        $list = $admin -> where($whereSql) -> order('id') -> limit($Page->firstRow.','.$Page->listRows) -> select();

        /**
         * laypage 整体刷新式分页
         */
//        $page = I('get.page/d',1);
//        $limit = 2;
//        $pages = ceil($count / $limit);
//        $start = empty($page - 1) ? 0 : (($page - 1) * $limit);
//        $list = $admin -> where($whereSql) -> order('id') -> limit($start.','.$limit) -> select();
//        $this -> assign('pages',$pages);


        $this -> assign('title', $title);
//        $this -> assign('list', $list);
        $this -> display();
    }

    /**
     * laypage jquery.ajax 异步请求分页
     */
    public function pageList(){
        $page = I('get.page/d',1);
        $title = I('get.title/s');
        $whereSql = empty($title) ? '' : 'name like "%' . $title . '%" or realName like "%' . $title . '%"';

        $admin = M('admin');

        // 查询满足要求的总记录数
        $count = $admin->where($whereSql) -> count();

        $limit = 8;
        $pages = ceil($count / $limit);
        $start = empty($page - 1) ? 0 : (($page - 1) * $limit);

//        $list = $admin -> where($whereSql) -> order('id') -> limit($start.','.$limit) -> select();

        /**
         * 刚开始用的傻缺方法  获取数组$agArr 键和值分别为 用户id及其对应的用户组名称
        */
//        //  获取关联表数据  用户id对应分组id
//        $admin_group = M('admin_group');
//        $arr = $admin_group -> order('uid') -> limit($start.','.$limit) -> select();
//        //  获取分组表数据  分组ID对应分组名称
//        $group = M('group');
//        $arr2 = $group -> field('id,title') -> select();
//        //  通过循环 使用户id 对应他的 分组名称  结果集放入$agArr数组
//        foreach($arr2 as $v2){
//            foreach($arr as $v){
//                if($v2['id'] == $v['group_id']){
//                    $agArr[$v['uid']] = $v2['title'];
//                }
//            }
//        }
        /**
         * 后来用的方法   多表联合查询
         */
        $list = $admin  -> alias('a') -> field('a.*,g.title') -> join('left join dx_admin_group ag on a.id = ag.uid left join dx_group g on ag.group_id = g.id') -> order('a.id') -> limit($start.','.$limit) -> select();

        //  传给laypage分页js 的列表内容
        $content = '';
        foreach($list as $value){
            $content .= '<tr><td>' . $value['id'] . '</td><td>' . $value['name'] . '</td><td>';
            if(empty($value['img'])){
                $content .= '<img src="/Public/Admin/img/profile_small.jpg" style="width: 50px; height: 50px; border-radius: 50%;">';
            }else{
                $content .= '<img src="/' . $value['img'] . '" style="width: 50px; height: 50px; border-radius: 50%;">';
            }
            $content .= '</td><td>' . $value['title'] . '</td><td>' . $value['realname'] . '</td><td>' . $value['loginnum'] . '</td><td>' . $value['logintime'] . '</td><td>';
            if($value['status']){
                    $content .= '<a href="javascript:statusChange(' . $value['id'] . ');" class="btn btn-outline btn-sm btn-primary" id="status' . $value['id'] . '">正常</a>';
                }else{
                    $content .= '<a href="javascript:statusChange(' . $value['id'] . ');" class="btn btn-outline btn-sm btn-danger" id="status' . $value['id'] . '">禁用</a>';
                }
            $content .= '</td><td><div class="col-md-12"><a class="btn btn-sm btn-outline btn-warning" href="' . U('Admin/admin/edit/id/' .$value['id']) . '"><i class="fa fa-edit"></i> 修改</a><a class="btn btn-sm btn-outline btn-danger" href="javascript:del(' . $value['id'] . ')"><i class="fa fa-trash-o"></i> 删除</a></div></td></tr>';
        }
        $data = [
            'pages' => $pages,
            'content' => $content,
        ];
        echo json_encode($data);
    }

    /**
     * 添加管理员 表单
     */
    public function add(){
        $group = M('group');
        $groupInfo = $group -> field('id,title') ->select();
        $this -> assign('groupInfo', $groupInfo);
        $this -> display();
    }

    /**
     * 添加 修改 管理员
     */
    public function Save(){
        if(IS_POST && IS_AJAX){
            $id = I('post.id/d','');
            if(empty($id)){
                /**
                 * ID为空即为添加
                 */
                //  验证用户名
                $name = I('post.name/s','');
                if(!$name){
                    $this -> ajaxReturn(['status' => 1, 'msg' => '用户名不能为空']);
                }
                $admin = M('admin');
                //  开启事务
                $admin -> startTrans();

                $r = $admin ->field('id') -> where(['name' => $name]) -> find();
                if(!is_null($r)){
                    $this -> ajaxReturn(['status' => 1, 'msg' => '用户名已被占用']);
                }
                //  验证密码
                $pwd = I('post.pwd/s','');
                if(!$pwd){
                    $this -> ajaxReturn(['status' => 1, 'msg' => '密码不能为空']);
                }
                //  验证真实姓名
                $realName = I('post.realName/s','');
                if(!$realName){
                    $this -> ajaxReturn(['status' => 1, 'msg' => '真实姓名不能为空']);
                }
                //  获取头像
                $imgPath = '';
                if(0 != $_FILES['img']['size']){
                    $imgPath = uploadFile($_FILES['img']);
                }
                if(is_array($imgPath)){
                    $this -> ajaxReturn($imgPath);
                }

                $status = I('post.status/d',0);

                //  获取随机盐
                $salt = _getSalt(9);
                //  获取用户组
                $groupid = I('post.groupid/d',0);
                if(!$groupid){
                    $this -> ajaxReturn(['status' => 1, 'msg' => '请为用户选择用户组']);
                }

                //  在这里使用add方法时  打印出的sql语句没有salt字段 暂未找到原因  2017-4-15
                //  已解决 原因为 thinkphp的数据库字段缓存 位于Runtime/Data/_fields/  清空后再试  2017-4-17 11:06:00
                $data = [
                    'name' => $name,
                    'salt' => $salt,
                    'pwd' => _md5($pwd,$salt),
                    'realName' => $realName,
                    'img' => $imgPath,
                    'status' => $status
                ];
                $isAdd = $admin -> add($data);
//                $isAdd = $admin -> execute('INSERT INTO `dx_admin` (`name`,`salt`,`pwd`,`realname`,`status`) VALUES ("' . $name . '","' . $salt . '","' . $pwd . '","' . $realName . '","' . $status . '")');

                //  如果主键ID为自增 则add方法返回的是最新插入的主键值
                $newid = $isAdd;
                //  插入用户和分组关联表
                $admin_group = M('admin_group');
                $data = ['uid' => $newid, 'group_id' => $groupid];
                $isAdd2 = $admin_group -> add($data);

                //  两个插入操作任意一个失败  则回滚事务
                if((!$isAdd) || (!$isAdd2)){
                    $admin -> rollback();
                    $this -> ajaxReturn(['status' => 1, 'msg' => '添加失败']);
                }
                //  成功则提交事务
                $admin -> commit();
                $this -> ajaxReturn(['status' => 0, 'msg' => '添加成功']);
            }else{
                /**
                 * ID不为空即为修改
                 */
                $admin = M('admin');

//                //  通过提交的title 查询数据库
//                $r = $admin ->field('id') -> where(['name' => $name]) -> find();
//                //  如果$r不为空则说明提交的title已存在
//                if(!is_null($r)){
//                    //  如果已存在的title 的id值 等于要修改的id值  说明查到的相同title是它本身 若不相等 说明名称已被占用
//                    if($r['id'] != $id){
//                        $this -> ajaxReturn(['status' => 1, 'msg' => '用户名已被占用']);
//                    }
//                }

                $adminData = $admin -> where(['id' => $id]) -> find();
                if(empty($adminData)){
                    $this -> ajaxReturn(['status' => 1, 'msg' => '用户不存在']);
                }
                //  获取真实姓名
                $realName = I('post.realName/s','');
                //  获取状态
                $status = I('post.status/d',0);
                //  获取用户组
                $groupid = I('post.groupid/d',0);
                //  获取头像
                $imgPath = '';
                if(0 != $_FILES['img']['size']){
                    $imgPath = uploadFile($_FILES['img']);
                }

                if(empty($groupid) && empty($realName) && empty($imgPath)){
                    $this->ajaxReturn(['status' => 0 , 'msg' => '更新成功！']);
                }
                if(!empty($groupid) && empty($realName)){
                    $isGroup = M("admin_group")->add(['uid'=>$id,'group_id'=>$groupid],[],true);
                    if(!$isGroup){
                        $this->ajaxReturn(['status' => 1 , 'msg' => '更新失败！']);
                    }
                    $this->ajaxReturn(['status' => 0 , 'msg' => '更新成功！']);
                }
                if(empty($groupid) && (!empty($realName) || !empty($imgPath))){
                    $data = [];
                    if(!empty($realName)){
                        $data['realName'] = $realName;
                    }
                    if(!empty($imgPath)){
                        if(is_array($imgPath)){
                            $this -> ajaxReturn($imgPath);
                        }
                        $data['img'] = $imgPath;
                    }
                    $isAdUp = $admin->where('id='.$id)->setField($data);
                    if(!$isAdUp){
                        $this->ajaxReturn(['status' => 1 , 'msg' => '更新失败！']);
                    }
                    $this->ajaxReturn(['status' => 0 , 'msg' => '更新成功！']);
                }

                //  都不为空时 更新两个表 使用事务
                //  开启事务
                $admin -> startTrans();

                //  更新用户表
                $isUp = $admin -> where(['id' => $id]) -> setField(['realName' => $realName, 'status' => $status]);

                //  更新用户和分组的关联表
                $admin_group = M('admin_group');
                //  使用add方法  开启允许覆盖 即没有要插入的值时插入  如果值已存在 则覆盖(即为更新)
                $isUp2 = $admin_group -> add(['uid'=>$id, 'group_id' => $groupid],[],true);

                if((false === $isUp) || (false === $isUp2)){
                    $admin -> rollback();
                    $this -> ajaxReturn(['status' => 1, 'msg' => '更新失败']);
                }
                $admin -> commit();
                $this -> ajaxReturn(['status' => 0, 'msg' => '更新成功']);
            }
        }else{
            $this -> ajaxReturn(['status' => 1, 'msg' => '非法操作']);
        }
    }

    /**
     * 修改管理员信息 表单
     */
    public function edit(){
        if(!IS_GET){
            $this -> error('非法操作','/Admin/admin/index');
            exit;
        }
        $id = I('get.id/d',0);
//        //  获取要修改的管理员信息
//        $admin = M('admin');
//        $adminInfo = $admin -> where(['id' => $id]) -> find();
//        //  从关联表获取id对应的 分组id
//        $admin_group = M('admin_group');
//        $groupid = $admin_group -> where(['uid' => $id]) -> find();

        //  多表联合查询  获取要修改的管理员信息 获取id对应的 分组id
        $admin = M('admin');
        $arr = $admin -> alias('a') -> field('a.*,ag.group_id') -> join('left join dx_admin_group ag on a.id = ag.uid') -> where(['id' => $id]) -> find();

        //  获取用户组信息
        $group = M('group');
        $groupInfo = $group -> field('id,title') ->select();

        $this -> assign('arr', $arr);
//        $this -> assign('arr',$adminInfo);
        $this -> assign('groupInfo', $groupInfo);
//        $this -> assign('groupid', $groupid);
        $this -> display();
    }

    /**
     * 更改管理员状态
     */
    public function statusChange(){
        if(IS_AJAX && IS_POST){
            $id = I('post.id/d',0);
            if(empty($id)){
                $this -> ajaxReturn(['status' => 1, 'msg' => '非法操作']);
            }
            if(1 == $id){
                $this -> ajaxReturn(['status' => 1, 'msg' => '哥是超级管理员,无法禁用..']);
            }
            $admin = M('admin');
            $r = $admin ->field('status') -> where(['id' => $id]) -> find();
            if(1 == $r['status']){
                $admin -> where(['id' => $id]) -> setField('status', 0);
                $this -> ajaxReturn(['status' => 0, 'msg' => '已禁用', 'data' => 0]);
            }else{
                $admin -> where(['id' => $id]) -> setField('status', 1);
                $this -> ajaxReturn(['status' => 0, 'msg' => '已开启', 'data' => 1]);
            }
        }else{
            $this -> ajaxReturn(['status' => 1, 'msg' => '非法操作']);
        }
    }
    /**
     * 删除管理员
     */
    public function del(){
        if(IS_AJAX && IS_POST){
            $id = I('post.id/d');
            if(empty($id)){
                $this -> ajaxReturn(['status' => 1, 'msg' => '非法操作']);
            }
            if(1 == $id){
                $this -> ajaxReturn(['status' => 1, 'msg' => '哥是超级管理员,哥最叼..']);
            }
            $admin = M('admin');
            //  开启事务
            $admin -> startTrans();

            //  删除用户表信息
            $isDel = $admin -> delete($id);
            //  删除关联表信息
            $admin_group = M('admin_group');
            $isDel2 = $admin_group -> where(['uid' => $id]) -> delete();

            //  任一失败 则回滚
            if((!$isDel) || (!$isDel2)){
                $admin -> rollback();
                $this -> ajaxReturn(['status' => 1, 'msg' => '删除失败']);
            }
            //  成功则提交
            $admin -> commit();
            $this -> ajaxReturn(['status' => 0, 'msg' => '删除成功']);
        }else{
            if(empty($id)){
                $this -> ajaxReturn(['status' => 1, 'msg' => '非法操作']);
            }
        }
    }
}